package uniandes.cupi2.photoViewer.mundo;

import java.util.Date;

import uniandes.cupi2.photoViewer.listas.IListaFoto;


public class ListaFoto implements IListaFoto<Foto> {
	

	public final static String ASCENDENTE = "Ascendente";
	public final static String DESCENDENTE = "Descendente";



	private Foto primerElemento;

	private Foto ultimoElemento;

	private int longitud;

	public ListaFoto() {
		longitud = 0;
	}

	@Override
	public boolean adicionar(Foto aAgregar) {

		boolean respuesta = false;

		if (primerElemento == null) {
			primerElemento = aAgregar;
			ultimoElemento = aAgregar;
			longitud++;
			respuesta = true;
		} else {
			ultimoElemento.cambiarSiguiente(aAgregar);
			ultimoElemento = aAgregar;
			longitud++;
			respuesta = true;
		}

		return respuesta;
	}

	public int darLongitud() {

		return longitud;
	}

	@Override
	public boolean eliminar(String aEliminar)
	{
		boolean respuesta=false;
		
		if (primerElemento.getNombre().equals(aEliminar) && longitud==1)
		{
			
			longitud=0;
			respuesta= true;
			primerElemento=null;
			ultimoElemento=null;
		}
		else if (primerElemento.getNombre().equals(aEliminar) && longitud>=1){
			
			primerElemento=primerElemento.darSiguiente();
			longitud--;
			respuesta=true;
			
		}
		else 
		{
			Foto actual=primerElemento;
			boolean eliminado=false;
			while( actual.darSiguiente() != null && eliminado)
			{
				if( actual.darSiguiente().getNombre().equals(aEliminar) && actual.darSiguiente() != ultimoElemento )
				{
					Foto actualTemp= actual.darSiguiente();
					actual.cambiarSiguiente(actualTemp.darSiguiente());
					eliminado=true;
				}
				else if (actual.darSiguiente().getNombre().equals(aEliminar) && actual.darSiguiente() == ultimoElemento)
				{
					ultimoElemento = actual;
					ultimoElemento.cambiarSiguiente(null);
				}
				else
				{
					actual= actual.darSiguiente();
				}
			}
			longitud--;
		}
		
		return false;

	}
	
		
	public Foto localizarAnterior(Foto anterior) {
		Foto actual = primerElemento;

		while (actual != null) {
			anterior = actual;
			actual = actual.darSiguiente();
		}

		return actual != null ? anterior : null;
	}

	

	@Override
	public void ordenar(String tipoOrdenamiento) 
	{
		while (primerElemento != null && primerElemento.darSiguiente() != null) 
		{

			if (tipoOrdenamiento.equalsIgnoreCase(ASCENDENTE))
			{
				Foto inicio = primerElemento;
				Foto nuevo = null;
				for (int i = 0; i < longitud - 1; i++) {

					nuevo = inicio.darSiguiente();
					for (int j = i + 1; j < longitud; j++) {

						if (inicio.getNombre().compareTo(nuevo.getNombre()) > 0) {

							Foto temporal = inicio;
							inicio = nuevo;
							nuevo = temporal;

						} else {

							Foto signuevo2 = localizarAnterior(inicio);
							Foto signuevo3 = inicio.darSiguiente();

							Foto signuevo4 = localizarAnterior(nuevo);
							Foto signuevo5 = nuevo.darSiguiente();

							inicio.cambiarSiguiente(signuevo5);
							cambiarAnterior(inicio, signuevo4);

							nuevo.cambiarSiguiente(signuevo3);
							cambiarAnterior(nuevo, signuevo2);

							signuevo2.cambiarSiguiente(nuevo);
							cambiarAnterior(signuevo3, nuevo);

							signuevo4.cambiarSiguiente(inicio);
							cambiarAnterior(signuevo5, inicio);

						}

						nuevo = nuevo.darSiguiente();
					}
					inicio = inicio.darSiguiente();

				}
				
			}
		}
	}
			

		
		
	public Foto buscarFotoPorEtiqueta(String nEtiqueta)
	{

		Foto buscado = null;
		Foto actual = primerElemento;
		if( longitud >= 1 && primerElemento.existeEtiqueta(nEtiqueta))
		{
			buscado = primerElemento;
		}
		else if( longitud == 2 )
		{
			if( primerElemento.existeEtiqueta(nEtiqueta) )
			{
				buscado=primerElemento;
			}
			if( ultimoElemento.existeEtiqueta(nEtiqueta) )
			{
				buscado=ultimoElemento;
			}
		}
		else 
		{
			if( actual != null )
			{
				boolean encontrado = false;
				while( actual.darSiguiente( ) != null && !encontrado )
				{
					if( actual.existeEtiqueta(nEtiqueta) )
					{
						encontrado = true;
						buscado=actual;
					}
					actual = actual.darSiguiente( );
				}
			}
		}
		return buscado;
	}
	
	
	
	public void cambiarAnterior(Foto actual, Foto anterior) 
	{


		actual = primerElemento;
		anterior = null;

		while (actual != null) {

			Foto x = localizarAnterior(actual);
			x = anterior;

		}
	}


	

	@Override
	public Foto buscarFotoPorFecha(Date fecha)
	{
		Foto buscado = null;
		Foto actual = primerElemento;
		if( longitud >= 1 && primerElemento.getFecha() == fecha )
		{
			buscado = primerElemento;
		}
		else if( longitud == 2 )
		{
			if( primerElemento.getFecha() == fecha )
			{
				buscado=primerElemento;
			}
			if( ultimoElemento.getFecha() == fecha )
			{
				buscado=ultimoElemento;
			}
		}
		else 
		{
			if( actual != null )
			{
				boolean encontrado = false;
				while( actual.darSiguiente( ) != null && !encontrado )
				{
					if( actual.getFecha() == fecha )
					{
						encontrado = true;
						buscado=actual;
					}
					actual = actual.darSiguiente( );
				}
			}
		}
		return buscado;
	}



	@Override
	public String[] toArray() 
	{
		String[ ] resultado= new String[ longitud ];
		Foto actual = primerElemento;
		int posicion = 0;
		while( actual != null )
		{
			resultado[ posicion ] = actual.getNombre( );
			posicion++;
			actual = actual.darSiguiente();
		}
		return resultado;
	}

	
	
	public boolean existeFoto(String nombreFoto)
	{
		boolean existe = false;
		Foto actual = primerElemento;
		for(int i = 0; i < longitud && !existe; i++)
		{
			if(actual.getNombre().equals(nombreFoto))
			{
				existe = true;
			}
			actual = actual.darSiguiente();
		}
		return existe;
	}

	@Override
	public Foto buscarPorNombre(String nombre) {
		// TODO Auto-generated method stub
		return null;
	}

}
		
